如何在Python中拟合一个阶梯函数 |
您所在的位置:网站首页 › python model函数 › 如何在Python中拟合一个阶梯函数 |
我的做法是这样的。 我保留了xobs和yobs。 import numpy as np from scipy.optimize import curve_fit import matplotlib.pyplot as plt xobs=np.linspace(0,10,100) yl=np.random.rand(50); yr=np.random.rand(50)+100 yobs=np.concatenate((yl,yr),axis=0)现在,必须生成Heaviside函数。为了让你了解这个函数的概况,请考虑海维斯德函数的半最大值惯例。 在Python中,这相当于。【替换代码3 一个样本情节将是。 xval = sorted(np.concatenate([np.linspace(-5,5,100),[0]])) # includes x = 0 yval = f(xval) plt.plot(xval,yval,'ko-') plt.ylim(-0.1,1.1) plt.xlabel('x',size=18) plt.ylabel('H(x)',size=20)Now, plotting xobs and yobs gives: plt.plot(xobs,yobs,'ko-') plt.ylim(-10,110) plt.xlabel('xobs',size=18) plt.ylabel('yobs',size=20)请注意,比较这两幅图,第二幅图移位了5个单位,最大值从1.0增加到100。我推断,第二个图的函数可以表示为:。 or in Python: (0.5 * (np.sign(x-5) + 1) * 100 = 50 * (np.sign(x-5) + 1) 结合这些图可以得出(其中Fit代表上述拟合函数)。 该图证实了我的猜测是正确的。现在,假设你不知道这个正确的拟合函数是怎么来的,那么一个通用的拟合函数就产生了。def f(x,a,b,c): return a * (np.sign(x-b) + c),其中理论上,a = 50,b = 5,和c = 1。 继续进行估计。 popt,pcov=curve_fit(f,xobs,yobs,bounds=([49,4.75,0],[50,5,2])). Now, bounds = ([lower bound of each parameter (a,b,c)],[upper bound of each parameter]). Technically, this means that 49 < a < 50, 4.75 < b < 5, and 0 < c < 2. 以下是popt和pcov的MY结果。
pcov代表popt的估计协方差。对角线提供了参数估计的方差[Source]. 结果显示,参数估计值pcov接近理论值。 基本上,一个广义的海维塞德函数可以用以下方式表示。【替换代码23 下面是将生成参数估计值和相应协方差的代码。 import numpy as np from scipy.optimize import curve_fit xobs = np.linspace(0,10,100) yl = np.random.rand(50); yr=np.random.rand(50)+100 yobs = np.concatenate((yl,yr),axis=0) def f(x,a,b,c): return a * (np.sign(x-b) + c) # Heaviside fitting function popt, pcov = curve_fit(f,xobs,yobs,bounds=([49,4.75,0],[50,5,2])) print 'popt = %s' % popt print 'pcov = \n %s' % pcov最后,注意到popt和pcov的估计值不同。 pythonscipy |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |